import {Config} from './config.js';
import {Token} from './token.js';
class Base{
  constructor(){
    "use strict";
    this.baseRestUrl = Config.baseRequestUrl;
  }

  request(params, noRefetch){
    var that = this,
      url = this.baseRestUrl + params.url;
    if (!params.type) {
      params.type = 'GET';
    }
    /*不需要再次组装地址*/
    if (params.setUpUrl == false) {
      url = params.url;
    }
    var  header = params.header;
    if (typeof params.header == 'undefined'){
      header={'content-type':'application/json','token': wx.getStorageSync('token')}
    }

    if (!params.responseType) {
      params.responseType = 'text';
    }

    wx.request({
      url: url,
      data: params.data,
      method: params.type,
      header: header,
      responseType:params.responseType,
      success: function (res) {
        // 判断以2（2xx)开头的状态码为正确
        // 异常不要返回到回调中，就在request中处理，记录日志并showToast一个统一的错误即可
        var code = res.statusCode.toString();
        var startChar = code.charAt(0);
        if (startChar == '2') {
    
         params.success(res);
        } else {
          if (code == '401') {
            if (!noRefetch) {
              that._refetch(params);
            }
          }
          that._processError(res);
          params.fail && params.fail(res);
        }
      },
      fail: function (err) {
        //wx.hideNavigationBarLoading();
        that._processError(err);
        params.fail && params.fail(err);
      }
    });
  }

  pay(url,callback){
    wx.showLoading({
      title: '加载中',
    })
    // 重新获取token
    this.request({
      url:url,
      success: function (res) {
        wx.hideLoading()
        var data = res.data.data;
        var status = res.data.data.status;
        // 判断用户是否已经存入手机号
        // 如果没有填写手机号，则先填写手机号
        // 如果有手机号则可以拉起支付

        if (status == 1) {
          // 验证手机号码
          wx.showToast({
            title: '手机号未认证，请先去认证手机号~', icon:'none'
          })
          // Notify('您的手机号码还没有认证，请先去认证手机号~')
          setTimeout(function () {
            wx.reLaunch({
              url: '/pages/my/index'
            })
          }, 2500)

        } else if (status == 2) {
          //拉起支付
          wx.requestPayment({
            'timeStamp': data.timeStamp,
            'nonceStr': data.nonceStr,
            'package': data.package,
            'signType': data.signType,
            'paySign': data.paySign,
            'success': function (res) {
              wx.showToast({
                title: '支付成功', icon: 'none'
              })
              setTimeout(function () {
                wx.navigateTo({
                  url: '/pages/coupon/my',
                })
              }, 2500)
            },
            'fail': function (res) {
              console.log(res)
              if (res.errMsg == "requestPayment:fail cancel") {
                wx.showToast({ title: '订单未支付，请在24小时内完成支付', icon: 'none'})
                setTimeout(function () {
                  wx.navigateTo({
                    url: '/pages/order/index',
                  })
                }, 2500)
              } else {
                wx.showToast({ title: '支付失败,请稍后重试~', icon: 'none'})
                setTimeout(function () {
                  wx.hideToast();
                }, 1500)
              }
            }
          })
        }
        callback && callback(res);
      }
    });
  }
  
  // 获取系统配置
  system(callback){
    this.request({
      url: '/system',
      success: function (res) {
        callback && callback(res)
      },
      fail: function (res) {
        callback && callback(res)
      }
    })
  }

   // 获取广告图片 基础方法
   getAd(key,callback){
    this.request({
      url: '/ad/'+key,
      success: function (res) {
        callback(res.data);
      }
    });
  }

  _processError(err) {
    console.log(err);
  }

  _refetch(param) {
    var token = new Token();
    token.getToken((token) => {
      this.request(param, true);
    });
  }

  // ---------------------------


  /* 函数描述：作为上传文件时递归上传的函数体；
    * 参数描述： 
    * filePaths是文件路径数组
    * i是文件路径数组的指标
    * length是文件路径数组的长度
    * data 额外参数
    */      
   uploadDIY(url,filePaths,i,length,data,callback){
    var key=this._eachImgKey(i,filePaths)
    wx.uploadFile({
      url: url,
      filePath: filePaths[key]+'',
      name: 'file',
      header: { 'content-type': 'application/json', 'token': wx.getStorageSync('token') },
      formData: data,
      success: (res)=> {
        var resData = JSON.parse(res.data)
        var statusCode = res.statusCode;
        if (statusCode == 401) {   //token 错误
          var token = new Token();
          token.getToken((res) => {
            this.uploadDIY(url,filePaths,i,length,data,callback)
          })
          return ;
        }

        wx.hideLoading();
        if (statusCode != 200 && statusCode != 401) {  //上传失败
          wx.showToast({
            title: resData.msg, icon: 'none'
          })
          return;
        }

        i++;
        if(length==i) {   //如果图片全部上传完成，则提交数据
          console.log('提交数据');
          callback&&callback()
        }else{
          this.uploadDIY(url,filePaths,i,length,data,callback)
        } 
      },
      fail: function (res) {
        wx.showToast({
          title: '网络错误，请稍后重试~',
          icon: 'none'
        });
      }
    })
  }

  /**
   * 获取第几个图片的KEY
   * @param {*} index 
   * @param {*} imgs 
   */
  _eachImgKey(index,imgs){
    var i=0;
    for(var key in imgs){
      if(i==index){
        return key;
      }else{
        i++;
      }
    }
  }
}

export {Base};